package cn.ncupyh.StudentManage;

import cn.ncupyh.Test.User;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

/*注册要求:
1，用户名需要满足以下要求
验证要求: 用户名唯一
用户名长度必须在3~15位之间
只能是字母加数字的组合，但是不能是纯数字

2.密码键盘输入两次，两次一致才可以进行注册

3.身份证号码需要验证。
验证要求:
长度为18位
不能以0为开头
前17位，必须都是数字
最为一位可以是数字，也可以是大写X或小写x

4.手机号验证
验证要求:
长度为11位
不能以0为开头
必须都是数字*/

//解析:
/*注册:
账号合法-->
Scanner 键盘录入用户名username
1.先到list集合中判断是否存在 contains / getindex2.长度必须再3~15之间。可以用字符串的length()
3.先循环获取username里面的每一个字符如果有一个字符不在a'~z'A~Z0~9，
那么当前用户名不符合条件统计一下用户名username当中有多少个字符在a-z A-Z判断一个个数，只有大于等于0才是满足要求的用户名

密码合法-->
利用Scanner第一次输入密码利用Scanner第二次输入密码只有两次一致，才是符合要求的，否则不符合要求

身份证合法-->
键盘录入身份证号码
1.调用字符串里面的length () 方法获取长度，只有为18的时候才满足2.可以调用charAt (0) 获取第一个字符，跟0'进行比较
3.遍历前面17位，如果有一个不在''~9'这个范围当中，那么就是不符合的4.获取最后一个字符，如果这个字符在0'~9"之间 或者X' 或者x 那么就满足

*/

/*登录:
1，键盘录入用户名
2，键盘录入密码
3，键盘录入验证码验证要求:
用户名如果未注册，直接结束方法，并提示:用户名未注册，请先注册判断验证码是否正确，
如不正确，重新输入再判断用户名和密码是否正确，有3次机会*/

/*忘记密码:
1.键盘录入用户名，判断当前用户名是否存在，如不存在，直接结束方法，并提示:未注册.
2，键盘录入身份证号码和手机号码
3，判断当前用户的身份证号码和手机号码是否一致，如果一致，则提示输入密码，进行修改。
如果不一致，则提示:账号信息不匹配，修改失败。*/

public class CreateMainMenu {
    public static void main(String[] args) {
        //首页
        //创建学生集合
        ArrayList<User> user = new ArrayList<>();
        loop:while (true){
            //目录
            System.out.println("----------------------------");
            System.out.println("-------学生选课系统-----------");
            System.out.println("----1>登录       2>注册----");
            System.out.println("----3>忘记密码    0>退出----");
            System.out.println("----------------------------");
            System.out.println("请输入选项:>");
            Scanner in = new Scanner(System.in);
            String input = in.next();
            //功能实现
            switch(input){
                case"0":{
                    System.out.println("退出!");
                    break loop;
                }
                case "1" :{//登录
                    login(user);
                    break ;
                }
                case "2":{//注册
                    register(user);
                    break ;
                }
                case "3" :{//忘记密码
                    forgetPassword(user);
                    break ;
                }
                default:{
                    System.out.println(" 输入错误,请重新输入!");
                    break ;
                }
            }
        }

    }


    /*忘记密码:
1.键盘录入用户名，判断当前用户名是否存在，如不存在，直接结束方法，并提示:未注册.
2，键盘录入身份证号码和手机号码
3，判断当前用户的身份证号码和手机号码是否一致，如果一致，则提示输入密码，进行修改。
如果不一致，则提示:账号信息不匹配，修改失败。*/
    private static void forgetPassword(ArrayList<User> user) {
        Scanner in = new Scanner(System.in);
        System.out.println("请输入用户名(账号):");
        String count = in.next();
        int indexCount = haveName(user, count);
        if(indexCount == -1){
            System.out.println("查无此用户!未注册!");
            return;
        }
        System.out.println("请输入身份证:");
        String ID = in.next();
        if(user.get(indexCount).getPersonID().equals(ID)){
            System.out.println("请输入手机号:");
            String phoneNum = in.next();
            if(user.get(indexCount).getPhoneNumber().equals(phoneNum)){
                System.out.println("请输入修改后的密码:");
                String password1 = in.next();
                user.get(indexCount).setPassword(password1);
                System.out.println("修改成功!");
                return;
            }else{
                System.out.println("账号信息不匹配，修改失败。");
                return;
            }
        }else{
            System.out.println("账号信息不匹配，修改失败。");
            return;
        }
    }

    /*登录:
    1，键盘录入用户名
    2，键盘录入密码
    3，键盘录入验证码验证要求:
    用户名如果未注册，直接结束方法，并提示:用户名未注册，请先注册
    4.判断验证码是否正确:如不正确，重新输入,再判断用户名和密码是否正确，有3次机会*/
    private static void login(ArrayList<User> user){
        Scanner in = new Scanner(System.in);
        //账号输入有三次机会
        int k = 3;
        boolean bk = true;
        boop:while (bk) {
            System.out.println("请输入用户名:");
            String count = in.next();
            boolean result = ifCountOnly(user, count);
            if(!result){
                //账号的下标
                int ide = haveName(user, count);
                //密码输入有三次机会
                int t = 3;
                boolean bt = true;
                while (bt) {
                    //录入密码
                    System.out.println("请输入用户的密码:");
                    String password = in.next();
                    String password1 = user.get(ide).getPassword();
                    if(password1.equals(password)){
                        break boop;
                    }
                    t--;
                    if(t == 0)
                        bt = false;
                }
            }else{
                System.out.println(count + "该账号未注册!");
            }
            k--;
            if(k == 0)
                bk = false;
        }
        while (true) {
            //验证码:
            String code = getCode();
            System.out.println(code);
            System.out.println("请输入验证码:");
            String code1 = in.next();
            boolean coderesult = ifCodeTrue(code, code1);
            if(coderesult){
                System.out.println("恭喜你,登陆成功!");
                break;
            }else{
                System.out.println("输入错误!请重新输入!");
                continue;
            }
        }
    }

    //判断验证码:不区分大小写
    private static boolean ifCodeTrue(String code,String code1) {
        char[] arrcode = code.toCharArray();
        char[] arrcode1 = code1.toCharArray();
        //先判断长度
        if(code.length() != code1.length()){
            System.out.println("长度不一致!");
            return false;
        }
        //判断大小写(不区分)
        for (int i = 0; i < arrcode.length; i++) {
            if(arrcode[i] != arrcode1[i] && arrcode[i] - 32 == arrcode1[i] && arrcode[i] + 32 == arrcode1[i] ){
                System.out.println("error");
                return false;
            }
        }
        return true;
    }

    //生成验证码:
    public static String getCode(){
//        先生成一个字符集合
        ArrayList<Character> list = new ArrayList<>();
        //插入:
        for (int i = 0; i < 26; i++) {
            list.add((char)('a' + i));
            list.add((char)('A' + i));
        }
        //随机抽取四个字符
        StringBuilder sb = new StringBuilder();
        Random r = new Random();
        for (int i = 0; i < 4; i++) {
            Character getChar = list.get(r.nextInt(list.size()));
            sb.append(getChar);
        }
//        System.out.println(sb);
//        再生成一个任意数字
        int num = (int) (Math.random() * 10);
        sb.append(num);
        char[] arr = sb.toString().toCharArray();
        int ind = (int) (Math.random() * (sb.length()-1));
        char tmp = arr[ind];
        arr[ind] = arr[sb.length()-1];
        arr[sb.length()-1] = tmp;

//        return arr.toString();//错误!!!
        return new String(arr);//正确
    }

    //注册
    private static void register(ArrayList<User> user) {
        //1.用户名唯一
        //用户名长度必须在3~15位之间
        //只能是字母加数字的组合，但是不能是纯数字
        String countTrue = ifCountTrue(user);
        System.out.println("账户唯一性!");
//        System.out.println(user.get(0).getUsername() + user.get(0).getPassword());

        //2.密码键盘输入两次，两次一致才可以进行注册
        ifPasswordTrue(user,countTrue);
//        System.out.println(user.get(0).getUsername() + user.get(0).getPassword());

        /*3.身份证号码需要验证。验证要求:
        长度为18位 不能以0为开头 前17位，必须都是数字
        最为一位可以是数字，也可以是大写X或小写x*/
        loop:while (true) {
            boolean personID = personID(user, countTrue);
            if(personID){
                System.out.println("身份证正确!");
                break loop;
            }else{
                System.out.println("错误!");
            }
        }

        //4.手机号录入
        checkNumber(user, countTrue);
        System.out.println("注册成功!!!");

//        //索引
//        for (int i = 0; i < user.size(); i++) {
//            User u = user.get(i);
//            u.toString();
//        }
        for (int i = 0; i < user.size(); i++) {
            User u = user.get(i);
            System.out.println(u.getUsername() + "\t"+u.getPassword()+"\t"+u.getPersonID()+"\t"+u.getPhoneNumber());
        }
    }

    //手机号码录入
    private static void checkNumber(ArrayList<User> user,String countTrue) {
        while (true) {
            //键盘录入:
            System.out.println("请输入学生的手机号:");
            Scanner in = new Scanner(System.in);
            String personNumber = in.next();
            //检查电话的合理性:11位,都是数字,开头部位0
            boolean numberTrue = NumberTrue(personNumber);
            if(!numberTrue){
                continue;
            }
            //查找账号是否存在
            int index = haveName(user, countTrue);
            //录入
            if(index == -1){
    //            return false;
                continue;
            }else{
                User u = user.get(index);
                u.setPhoneNumber(personNumber);
                return;
            }
        }
    }

    //手机号检测是否合理
    private static boolean NumberTrue(String Number) {
            if(Number.length() == 11){
                if(Number.charAt(0) != 0){
                    for (int i = 0; i < Number.length(); i++) {
                        if(Number.charAt(i) > '9' && Number.charAt(i) < '0' ){
                            return false;
                        }
                    }
                    return true;
                }else {
                    System.out.println("第一位不为0!请重新输入!");
                    return false;
                }
            }else {
                System.out.println("长度为11!请重新输入!");
                return false;
            }
    }

    //身份证号码需要验证。
    private static boolean personID(ArrayList<User> user,String countTrue) {
        while (true) {
            System.out.println("请输入学生的身份证号码:");
            Scanner in = new Scanner(System.in);
            String personID = in.next();
            //长度为18位 不能以0为开头 前17位，必须都是数字
            //最后一位可以是数字，也可以是大写X或小写x
            if(personID.length() == 18){
                if(personID.charAt(0) != '0'){
                    for (int i = 0; i < personID.length()-1; i++) {
                        if(personID.charAt(i) > '9' && personID.charAt(i) < '0' )
                            return false;
                    }
                    if(personID.charAt(17) == 'z'||
                            personID.charAt(17) == 'X' ||
                            (personID.charAt(17) < '9' && personID.charAt(17) > '0' )){
                        int index = haveName(user,countTrue);
                        User u = user.get(index);
                        u.setPersonID(personID);
                        return true;
                    }
                }else{
                    System.out.println("身份证的第一位不能为0!");
                    continue;
                }
            }else{
                System.out.println("身份证的长度不符合18位要求!");
                continue;
            }
        }
    }

    //密码键盘输入两次，两次一致才可以进行注册
    private static void ifPasswordTrue(ArrayList<User> user,String countTrue) {
        while (true) {
            System.out.println("请输入注册的密码:");
            Scanner in = new Scanner(System.in);
            String password = in.next();
            System.out.println("请再次输入注册的密码:");
            String passwordAgain = in.next();
            if(passwordAgain.equals(password)){
                int index = haveName(user,countTrue);
                User u = user.get(index);
                u.setPassword(password);
                return;
            }else{
                System.out.println("密码不正确,请重新输入!");
            }
        }
    }

    //输入:用户名唯一
    public static String ifCountTrue(ArrayList<User> user){
        while (true) {
            //输入注册的账号
            System.out.println("请输入注册的账号:");
            Scanner in = new Scanner(System.in);
            String name = in.next();
            //用户名必须唯一
            boolean countOnly = ifCountOnly(user, name);
            if(countOnly){
                //用户名长度必须在3~15位之间
                boolean lengthTrue = ifLengthTrue(name);
                if(lengthTrue){
                    for (int i = 0; i < name.length(); i++) {
                        if(name.charAt(i) < 'z' && name.charAt(i) > 'A'){
                            //插入到集合中
                            User u1 = new User();
                            user.add(u1);
                            u1.setUsername(name);
                            return name;
                        }
                    }
                    System.out.println("账户不可以为纯数字!");

                }else{
                    System.out.println("请将长度控制在3~15!");
                }
            }
        }
    }

    //面密码长度是否符合规定
    private static boolean ifLengthTrue(String name) {
        return (name.length() <= 15 ) && (name.length() >= 3);
    }

    //账号是否第一次出现:库里面是否有这个账号
    private static boolean ifCountOnly(ArrayList<User> user,String name) {
        //找不到id时,返回真
        return haveName(user, name) < 0;
    }


    //索引用户集合里面是否有这个账号
    private static int haveName(ArrayList<User> user,String name) {
        for (int i = 0;i < user.size();i++) {
            User u = user.get(i);
            String uname = u.getUsername();
            if(uname.equals(name)){
                //相等返回索引
                return i;
            }
        }
        return -1;
    }

    //登陆页面：
    public static void in(ArrayList<Student> students){
        //登陆页面：
        loop: while(true){
            //目录
            System.out.println("----------------------------");
            System.out.println("----------登录页面-----------");
            System.out.println("----1.add       2.delete----");
            System.out.println("----3.select    4.update----");
            System.out.println("----0.exit      ------------");
            System.out.println("请输入选项:>");
            Scanner in = new Scanner(System.in);
            String input = in.next();
            //创建学生集合

            switch(input){
                case "1" : {
                    add(students);
                    break;
                }
                case "2" : {
                    delete(students);
                    break;
                }
                case "3" : {
                    select(students);
                    break;
                }
                case "4" : {
                    update(students);
                    break;
                }
                case "0" : {
                    System.out.println("退出学生选课系统!");
                    //法一:
//                    break loop;
                    //法二:
                    System.exit(0);//停止虚拟机运行
                }
                default:{
                    System.out.println("输入错误,请重新输入!");
                }
            }
        }
    }

    //增加学生信息!
    public static void add(ArrayList<Student> students){
//        Student s = new Student();
        Scanner in = new Scanner(System.in);
        System.out.println("请输入学生id:");
        String id ;
        while (true) {
            id = in.next();
            boolean haveid = having(students,id);
            if(haveid){
                System.out.println("该学号已存在,请重新输入:");
            }else{
                break;
            }
        }

        System.out.println("请输入学生姓名:");
        String name = in.next();

        System.out.println("请输入学生年龄:");
        int age = in.nextInt();

        System.out.println("请输入学生住址:");
        String home = in.next();

        //将信息存入集合中
        Student s = new Student(id,name,age,home);
        students.add(s);
        System.out.println("添加信息成功!");
    }

    //删除学生信息!
    public static void delete(ArrayList<Student> students){
        if(students.size() == 0){
            System.out.println("没有可删除的学生!");
            return;
        }
        //删除
        //先展示学生信息
        select(students);
        System.out.println("请输入想删除的学生id:");
        Scanner in = new Scanner(System.in);
        String id = in.next();
        int index = findid(students, id);
        if(index >= 0){
            //删除
            students.remove(index);
            System.out.println("删除成功!");
        }else{
            System.out.println("不存在!请重新输入!");
        }
    }

    //查询(展示)学生信息!
    public static void select(ArrayList<Student> students){
        if(students.size() == 0){
            System.out.println("信息为空!请添加信息!");
            return;
        }
        int i = 0;
        System.out.println("id\t\t姓名\t年龄\t家庭住址");
        //for (Student s : students) {
        for(;i<students.size();i++){
            Student s = students.get(i);
            System.out.println(s.getId() + "\t" + s.getName() + "\t" + s.getAge() + "\t" +  s.getHome());
        }
    }

    //修改学生信息!
    public static void update(ArrayList<Student> students){
        //展示一波
        select(students);
        //查找id是否存在
        Scanner in = new Scanner(System.in);
        System.out.println("请输入要修改学生的id");
        String id = in.next();
        int sid = findid(students, id);
        if(sid >= 0){
            Student s = students.get(sid);
            //修改
            System.out.println("请输入修改后的学生姓名:");
            String name = in.next();
            s.setName(name);

            System.out.println("请输入修改后的学生年龄:");
            int age = in.nextInt();
            s.setAge(age);

            System.out.println("请输入修改后的学生住址:");
            String home = in.next();
            s.setHome(home);
            System.out.println("修改成功!");
        }else{
            System.out.println("该id:" + id + "不存在,请重新输入!");
            return;
        }
    }

    //查询学号是否存在
    public static boolean having(ArrayList<Student> students,String id){
//        for (int i = 0; i < students.size(); i++) {
//            Student s = students.get(i);
//            String sid = s.getId();
//            if(sid.equals(id)){
//                //注意:这里比较是否一致,不可以用==
//            return true;
//            }
//        }
//        return false;
        return findid(students,id) >=0 ;
    }

    //通过id返回索引
    public static int findid(ArrayList<Student> students, String id){
        for (int i = 0;i<students.size();i++) {
            Student s = students.get(i);
            String sid = s.getId();
            if(sid.equals(id)){
                //相等返回索引
                return i;
            }
        }
        return -1;
    }
}
